package ru.compft.common.services.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import ru.compft.common.dao.ModuleDao;
import ru.compft.common.data.Module;
import ru.compft.common.services.ModuleService;
import ru.compft.common.services.SystemService;

import javax.annotation.Resource;
import java.util.List;

/**
 * User: VVasiliev
 * Date: 14.06.12
 * Time: 14:03
 * Реализация сервиса работы с модулями пользователя
 * В сервисы добавляется некоторая логика, например проверка есть ли права на тот или иной объект у пользователя
 */
@Service
public class ModuleServiceImpl implements ModuleService {
    private static final Logger logger = LoggerFactory.getLogger(ModuleServiceImpl.class);

    @Resource(name = "moduleDao")
    private ModuleDao moduleDao;

//    @Resource(name = "moduleCache")
//    private ModuleCache moduleCache;

//    @Resource(name = "modulePageCache")
//    private ModulePageCache modulePageCache;

    @Resource(name = "systemService")
    private SystemService systemService;

    @Override
    public List<Module> getAllModules() {
        List<Module> resultList;
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (moduleCache.isInitialised()) {
//            resultList = moduleCache.getValues();
//        } else {
            resultList = moduleDao.getAllModules();
//        }
        // Добавляем все страницы каждому модулю
        if (!CollectionUtils.isEmpty(resultList)) {
            for (Module module : resultList) {
//                if (modulePageCache.isInitialised()) {
//                    module.setPageList(modulePageCache.getModuleIdToPagesMap().get(module.getId()));
//                } else {
                    module.setPageList(moduleDao.getAllPagesToModule(module.getId()));
//                }
            }
        }
        return resultList;
    }

    @Override
    public List<Module> getModules(int from, int count) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (moduleCache.isInitialised()) {
//            return CommonUtils.getPartOfList(from, count, moduleCache.getValues());
//        } else {
            return moduleDao.getModules(from, count);
//        }
    }

    @Override
    public int countAllModules() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (moduleCache.isInitialised()) {
//            return moduleCache.countSize();
//        } else {
            return moduleDao.countAllModules();
//        }
    }

    @Override
    public Module getModuleById(Long moduleId) {
        Module module;
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (moduleCache.isInitialised()) {
//            module = moduleCache.getIdToModuleMap().get(moduleId);
//        } else {
            module = moduleDao.getModuleById(moduleId);
//        }
        addPages(module);

        return module;
    }

    @Override
    public Module getModuleByCode(String code) {
        Module module;
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (moduleCache.isInitialised()) {
//            module = moduleCache.getCodeToModuleMap().get(code);
//        } else {
            module = moduleDao.getModuleByCode(code);
//        }
        // Добавляем все страницы каждому модулю
        addPages(module);
        return module;
    }

    @Override
    public Module editModule(Module module) {
        // сохраняем в БД
        Module updateResult = moduleDao.update(module);

        if (updateResult != null) {
            // сохраняем в кеше
//            moduleCache.updateModule(module);
        }
        return updateResult;
    }

    /**
     * Преинициализация кеша, если это необходимо
     */
//    private void preInit() {
//        // Если стоит системное свойство "использовать кеш" и если кеш не проинициализирован, то инициализируем его из DAO
//        if (systemService.isUseCache()) {
//            if (!moduleCache.isInitialised()) {
//                moduleCache.initFromList(moduleDao.getAllModules());
//            }
//
//            if (!modulePageCache.isInitialised()) {
//                modulePageCache.initFromList(moduleDao.getAllModulePages());
//            }
//        } else {
//            // очищаем кеш
//            moduleCache.clearRecords();
//            modulePageCache.clearRecords();
//        }
//    }

    /**
     * Добавляем все страницы
     *
     * @param module
     */
    private void addPages(Module module) {
        // Добавляем все страницы каждому модулю
        if (module != null) {
//            if (modulePageCache.isInitialised()) {
//                module.setPageList(modulePageCache.getModuleIdToPagesMap().get(module.getId()));
//            } else {
                module.setPageList(moduleDao.getAllPagesToModule(module.getId()));
//            }
        }
    }

}
